package gare.vente;

import gare.Gare;
import thread.Voyageur;

public class EspaceVente {
	
	private static int	NB_GUICHETS				= 5;
	
	public static int	TEMPS_IMPRESSION_TICKET	= 2000;
	
	private Guichet		lesGuichets[]			= new Guichet[NB_GUICHETS];
	
	private int			nbGuichetOcuppee		= 0;
	
	private int			nbPlaceDisponible		= 0;
	
	private Gare		gare;
	
	public EspaceVente(Gare gare) {
		this.gare = gare;
		for (int i = 0; i < NB_GUICHETS; i++)
			lesGuichets[i] = new Guichet(i, this);
	}
	
	public synchronized void accueillirVoyageur(Voyageur voyageur) {
		System.out.println(voyageur.toString() + " est en attente du service");
		while (nbGuichetOcuppee >= NB_GUICHETS) {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		for (Guichet guichet : lesGuichets) {
			if (guichet.estLibre()) {
				guichet.accueillir(voyageur);
				break;
			}
		}
		notifyAll();
	}
	
	/**
	 * Ajoute le nombre de place et notifie l'espace vente que les nouvelles
	 * places sont disponibles à vendre.
	 */
	synchronized public void ajouterNombrePlace(int nombrePlace) {
		this.nbPlaceDisponible += nombrePlace;
		notify();
		System.out.println(nombrePlace + " places ajoutées.");
		System.out.println("Nombre de palces disponibles: " + nbPlaceDisponible);
	}
	
	public synchronized void vendreBillet(Voyageur voyageur) {
		
		while (getNombrePlace() <= 0) {
			System.out.println("No place...wait");
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("Espace vente maintenant a des places.");
		
		Billet billet = new Billet(gare.getEspaceQuai().getPlace());
		while (billet == null) {
			try {
				wait();
				billet = new Billet(gare.getEspaceQuai().getPlace());
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		try {
			System.out.println(">>>Impression du billet...");
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		voyageur.prendreBillet(billet);
		nbPlaceDisponible--;
		// sortir le voyageur de sa guichet
		for (Guichet guichet : lesGuichets) {
			if (!guichet.estLibre() && guichet.getVoyageur().equals(voyageur))
				guichet.sortirVoyageur();
		}
	}

	public int getNombrePlace() {
		return nbPlaceDisponible;
	}
	
	public void afficher() {
		System.out.println(">>>");
		for (Guichet guichet : lesGuichets) {
			guichet.afficher();
		}
		System.out.println("\n<<<");
	}
}
